package com.zenithmind.chat.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 好友申请状态枚举 - 遵循开闭原则
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
@AllArgsConstructor
public enum FriendRequestStatus {
    
    /**
     * 待处理
     */
    PENDING(0, "待处理"),
    
    /**
     * 已同意
     */
    ACCEPTED(1, "已同意"),
    
    /**
     * 已拒绝
     */
    REJECTED(2, "已拒绝"),
    
    /**
     * 已过期
     */
    EXPIRED(3, "已过期");

    /**
     * 状态码 - 用于数据库存储
     */
    @EnumValue
    @JsonValue
    private final Integer code;

    /**
     * 状态描述
     */
    private final String description;

    /**
     * 根据状态码获取枚举
     * 
     * @param code 状态码
     * @return 对应的枚举值
     */
    public static FriendRequestStatus fromCode(Integer code) {
        if (code == null) {
            return PENDING;
        }
        
        for (FriendRequestStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        
        throw new IllegalArgumentException("未知的好友申请状态码: " + code);
    }

    /**
     * 检查是否为待处理状态
     * 
     * @return 是否待处理
     */
    public boolean isPending() {
        return this == PENDING;
    }

    /**
     * 检查是否为已处理状态
     * 
     * @return 是否已处理
     */
    public boolean isProcessed() {
        return this == ACCEPTED || this == REJECTED;
    }

    /**
     * 检查是否为已同意状态
     * 
     * @return 是否已同意
     */
    public boolean isAccepted() {
        return this == ACCEPTED;
    }

    /**
     * 检查是否为已拒绝状态
     * 
     * @return 是否已拒绝
     */
    public boolean isRejected() {
        return this == REJECTED;
    }

    /**
     * 检查是否为已过期状态
     * 
     * @return 是否已过期
     */
    public boolean isExpired() {
        return this == EXPIRED;
    }
}
